/*
 * DateHelper.java
 *
 * Created on 18. Juli 2007, 10:05
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.googlecode.oskis.library.date;
import java.util.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;

/**
 * Die Klasse DateHelper dient vor allem zum Formatieren von kurzen Eingabestrings als Datum.
 * Beispielsweise um ein JTextField als Datum zu formatieren.
 * Beispiele:
 * Angenommen das aktuelle Datum ist 24.07.2007 14:30:30, es wird der Default Formatstring verwendet
 * 0101       => 01.01.2007 14:30
 * ""         => 24.07.2007 14:30
 * 270507     => 27.05.2007 14:30
 * etc...
 * Erkannte Eingabeformate :
         * DD
         * DDMM
         * DDMMYY
         * DDMMHHMM
 *       * DDMMYYHHMM
 *       * v (vorgestern)
 *       * g (gestern)
 *       * m (morgen)
 *       * u (übermorgen)
 *       * 3 ( In 3 Tagen)
 *       * w (in einer Woche)
 *       * i (infinity - unendliches Datum für offene Zeiträume (31.12.9999 23:59:59)
 * 
 * 
 * @author thomas
 */
public class DateHelper {
    
    private String dateInputString;
    private String dateFormattedString;
    private String formatString;
    private String tmpFormat;
    private Date tmpDate;
    private boolean formatSuccess;
    private Date d;
    private GregorianCalendar c;
    private SimpleDateFormat f;
    private static final String DEFAULT_FORMAT_STRING="dd.MM.yyyy HH:mm";
    private Date aktDate;
    
    /** DateHelper ohne Parameter formatiert das aktuelle Datum mit dem Default Formatstring dd.MM.yyyy HH:mm */
    public DateHelper() {
        dateInputString=null;
        dateFormattedString=null;
        formatString=(DEFAULT_FORMAT_STRING);
        doFormat();
    }
    /** Formatiert den Eingabestring 
     *  mit dem Default Formatstring
     *  Beispiel: new DateHelper("270507");
     */
    public DateHelper(String is) {
        this.setInputString(is);
        formatString=(DEFAULT_FORMAT_STRING);
        doFormat();
    }
    /** Formatiert das übergebene Date Objekt */
    public DateHelper(Date d) {
        formatSuccess=false;
        formatString=(DEFAULT_FORMAT_STRING);
        f=new SimpleDateFormat(formatString);
        dateFormattedString=f.format(d);
        formatSuccess=true;
        aktDate=d;
    }
    
    /* Private Methods */
    private void doFormat() {
        int l;
        formatSuccess=false;
        f=new SimpleDateFormat(formatString);
        if (dateInputString==null) {
            d=new Date();
            dateFormattedString=f.format(d);
            formatSuccess=true;
            aktDate=d;
            return;
        }
        dateInputString.replaceAll("\\.","");
        l=dateInputString.length();
        
        /* Erkannte Eingabeformate :
         * DD
         * DDMM
         * DDMMYY
         * DDMMHHMM
         */
        
        
        
        if (l==0) {
            d=new Date();
            dateFormattedString="";
            formatSuccess=true;
            aktDate=d;
        }
        if (l==2) {
            d=new Date();
            c=new GregorianCalendar();
            c.setTime(d);
            c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(dateInputString));
            dateFormattedString=f.format(c.getTime());
            formatSuccess=true;
            aktDate=c.getTime();
        }
        if (l==4) {
            String day=dateInputString.substring(0,2);
            String month=dateInputString.substring(2,4);
            d=new Date();
            c=new GregorianCalendar();
            c.setTime(d);
            c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(day));
            c.set(Calendar.MONTH,Integer.parseInt(month)-1);
            dateFormattedString=f.format(c.getTime());
            formatSuccess=true;
            aktDate=c.getTime();
        }
        if (l==6) {
            String day=dateInputString.substring(0,2);
            String month=dateInputString.substring(2,4);
            String year=dateInputString.substring(4,6);
            int yyyy=Integer.parseInt(year);
            if (yyyy < 20) {
                yyyy+=2000;
            } else {
                yyyy+=1900;
            }
            d=new Date();
            c=new GregorianCalendar();
            c.setTime(d);
            c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(day));
            c.set(Calendar.MONTH,Integer.parseInt(month)-1);
            c.set(Calendar.YEAR,yyyy);
            dateFormattedString=f.format(c.getTime());
            formatSuccess=true; 
            aktDate=c.getTime();
        }
        if (l==8) {
            if (dateInputString.indexOf('.')>-1) {
                return;
            }
            String day=dateInputString.substring(0,2);
            String month=dateInputString.substring(2,4);            
            String hour=dateInputString.substring(4,6);            
            String minute=dateInputString.substring(6,8);
            d=new Date();
            c=new GregorianCalendar();
            c.setTime(d);
            c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(day));
            c.set(Calendar.MONTH,Integer.parseInt(month)-1);
            c.set(Calendar.HOUR_OF_DAY,Integer.parseInt(hour));
            c.set(Calendar.MINUTE,Integer.parseInt(minute));
            dateFormattedString=f.format(c.getTime());
            formatSuccess=true; 
            aktDate=c.getTime();
        }
        if (l==10) {
            if (dateInputString.indexOf('.')>-1) {
                return;
            }
            String day=dateInputString.substring(0,2);
            String month=dateInputString.substring(2,4);            
            String year=dateInputString.substring(4,6);            
            String hour=dateInputString.substring(6,8);
            String minute=dateInputString.substring(8,10);
            d=new Date();
            c=new GregorianCalendar();
            c.setTime(d);
            c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(day));
            c.set(Calendar.MONTH,Integer.parseInt(month)-1);
            c.set(Calendar.HOUR_OF_DAY,Integer.parseInt(hour));
            c.set(Calendar.MINUTE,Integer.parseInt(minute));
            c.set(Calendar.YEAR,Integer.parseInt(year)+2000);
            dateFormattedString=f.format(c.getTime());
            formatSuccess=true; 
            aktDate=c.getTime();
        }
        
        if (l==1) {
            d=new Date();
            if (dateInputString.equals("v")) {
                d.setTime(d.getTime()-1000*60*60*48);
            }
            if (dateInputString.equals("g")) {
                d.setTime(d.getTime()-1000*60*60*24);
            }
            if (dateInputString.equals("m")) {
                d.setTime(d.getTime()+1000*60*60*24);
            }
            if (dateInputString.equals("u")) {
                d.setTime(d.getTime()+1000*60*60*48);
            }
            if (dateInputString.equals("3")) {
                d.setTime(d.getTime()+1000*60*60*3*24);
            }
            if (dateInputString.equals("w")) {
                d.setTime(d.getTime()+1000*60*60*7*24);
            }
            if (dateInputString.equals("i")) {
                SimpleDateFormat tf=new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
                try {
                    d=tf.parse("31.12.9999 23:59:59");
                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
            dateFormattedString=f.format(d);
            formatSuccess=true;            
            aktDate=d;
        }
    }
    
    /* Public Methods */
    /** Ruft die Formatierungsfunktion auf */
    public void formatDate() {
        doFormat();
    }
    
    /** setzt den zu formatierenden String */
    public void setInputString(String is) {
        this.dateInputString=is;
    }
    
    /** setzt den Formatstring und formatiert damit den Eingabestring */
    public void setFormatString(String fs) {
        this.formatString=fs;
        doFormat();
    }
    
    /** true, wenn die Formatierung funktioniert hat */
    public boolean getFormatSuccess() {
        return(formatSuccess);
    }
    
    /** liefert den unformatierten Eingabestring zurück */
    public String getInputString() {
        return(dateInputString);
    }
    
    /** liefert den formatierten String */
    public String getFormattedDate() {
        return(dateFormattedString);
    }
    
    /** liefert den formatierten Eingabestring als Date Objekt */
    public Date getAktDate() {
        return(aktDate);
    }
}
